'use strict';
/**
 * author：小小游 --- allen
 * date：2018.02.08
 * lastUpdateDate：2018.02.08
 * description：函数的对象参数的解构和默认值的吊炸天用法
 */
// ES6设置默认值方式，变得极致吊炸天
/**
 * 这时候如果直接testFn ()调用为啥会报错，下面我简单解释下：
 * 首先这种testFn ()方法，它内部函数会这样解析，如下：
 * function testFn ({ a = 12, b = 15 } = undefined) {
 *     console.log(a, b);
 * }
 * 你在试图通过undefined.a,undefined.b显然是错误的，那么
 * 如何解决这个问题呢，如下几种方式：
 * 1.testFn ({ });
 * 2.testFn ({ a : 1000000 });
 * 3.testFn ({ b : 1000 })
 * 4.testFn ({ a : 200, b : 5000  });
 * 5.testFn ({ undefined, b : 5000 });
 * 第五种调用方式我解释下：
 * 如果调用testFn ()参数列表里面有undefined，那么就默认取默认值，
 * 除了undefined之外的其它值都是打印这个值，比如testFn ({ null, b : 5000 });
 * 那么此时会抛出错误(这是跟函数的数组参数的解构和默认值唯一的区别)，特别
 * 注意下
 *----------------------------*********-----------------------------
 * 那么我就想testFn ()直接调用有没有办法呢，把函数改造下，如下：
 * function testFn ({ a = 12, b = 15 } = {}) {
 *     console.log(a, b);
 * }
 * 当调用testFn ();不传任何参数的时候它会将右侧的{}.a和{}.b
 * 进行赋值，所以就可以正常打印结果了
 *----------------------------*********-----------------------------
 * 当调用testFn ();不传任何参数的时候，右侧的参数如果有undefined参数的
 * 话，打印出来的值就采取左侧的默认值。反之，如果没有undefined参数的话
 * 是什么就打印右侧的值，比如{ a = 12, b = 15 } = { 'a' : null, 'b' : 88 }，
 * 这里打印的值就是null 88
 */
function testFn ({ a = 12, b = 15 } = { 'a' : null, 'b' : 88 }) {
    console.log(a, b);
}

// result：null 88
testFn ();
